home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / comm2 / termsorc.lha / Extras / Source / gtlayout-source.lha / LTP_LayoutGroup.c < prev    next >
C/C++ Source or Header  |  1995-09-29  |  19KB  |  701 lines

  1. /*  GadTools layout toolkit
  2. **
  3. **  Copyright © 1993-1995 by Olaf `Olsen' Barthel
  4. **  Freely distributable.
  5. */
  6.  
  7. #include "gtlayout_global.h"
  8.  
  9. VOID __regargs
  10. LTP_LayoutGroup(LayoutHandle *Handle,ObjectNode *Group)
  11. {
  12.     if(!Handle -> Failed)
  13.     {
  14.         ObjectNode    *Node;
  15.         ObjectNode    *ReturnKey;
  16.         ObjectNode    *EscKey;
  17.         ObjectNode    *CursorKey;
  18.         ObjectNode    *TabKey;
  19.         ObjectNode    *ActiveString;
  20.         LONG         Left;
  21.         LONG         Top;
  22.         LONG         Width;
  23.         LONG         Height;
  24.         BOOLEAN         DefaultCorrection;
  25.  
  26.         Left            = 0;
  27.         Top            = 0;
  28.         ReturnKey        = NULL;
  29.         EscKey            = NULL;
  30.         CursorKey        = NULL;
  31.         TabKey            = NULL;
  32.         ActiveString        = NULL;
  33.         DefaultCorrection    = FALSE;
  34.  
  35.         if(Group -> Special . Group . SameSize)
  36.         {
  37.             LONG MaxWidth  = 0;
  38.             LONG MaxHeight = 0;
  39.  
  40.             SCANGROUP(Group,Node)
  41.             {
  42.                 LTP_DetermineSize(Handle,Node);
  43.  
  44.                 if(Node -> Type == BUTTON_KIND)
  45.                 {
  46.                     if(Node -> Special . Button . ReturnKey)
  47.                         ReturnKey = Node;
  48.                     else
  49.                     {
  50.                         if(Node -> Special . Button . EscKey)
  51.                             EscKey = Node;
  52.                     }
  53.  
  54.                     DefaultCorrection |= Node -> Special . Button . DefaultCorrection;
  55.                 }
  56.  
  57.                 if(Node -> Type == CYCLE_KIND)
  58.                 {
  59.                     if(Node -> Special . Cycle . TabKey)
  60.                         TabKey = Node;
  61.                 }
  62.  
  63. #if defined(DO_POPUP_KIND) && defined(DO_BOOPSI_KIND)
  64.                 if(Node -> Type == POPUP_KIND)
  65.                 {
  66.                     if(Node -> Special . Popup . TabKey)
  67.                         TabKey = Node;
  68.                 }
  69. #endif
  70.  
  71. #if defined(DO_TAB_KIND) && defined(DO_BOOPSI_KIND)
  72.                 if(Node -> Type == TAB_KIND)
  73.                 {
  74.                     if(Node -> Special . Tab . TabKey)
  75.                         TabKey = Node;
  76.                 }
  77. #endif
  78.  
  79.                 if(Node -> Type == MX_KIND)
  80.                 {
  81.                     if(Node -> Special . Radio . TabKey)
  82.                         TabKey = Node;
  83.                 }
  84.  
  85.                 if(Node -> Type == PASSWORD_KIND || Node -> Type == STRING_KIND || Node -> Type == FRACTION_KIND)
  86.                 {
  87.                     if(Node -> Special . String . Activate)
  88.                         ActiveString = Node;
  89.                 }
  90.  
  91.                 if(Node -> Type == INTEGER_KIND)
  92.                 {
  93.                     if(Node -> Special . Integer . Activate)
  94.                         ActiveString = Node;
  95.                 }
  96.  
  97.                 if(Node -> Type == LISTVIEW_KIND && Node -> Special . List . CursorKey)
  98.                     CursorKey = Node;
  99.  
  100.                 if(Node -> Width > MaxWidth)
  101.                     MaxWidth = Node -> Width;
  102.  
  103.                 if(Node -> Height > MaxHeight)
  104.                     MaxHeight = Node -> Height;
  105.             }
  106.  
  107.             if(ReturnKey || DefaultCorrection)
  108.             {
  109.                 SCANGROUP(Group,Node)
  110.                 {
  111. #ifdef OLD_STYLE_DEFAULT_KEY
  112.                     Node -> GroupIndent = TRUE;
  113.  
  114.                     Node -> Width    += 4 + 4;
  115.                     Node -> Height    += 2 + 2;
  116. #else
  117.                     Node -> Width    += 1 + 1;
  118.                     Node -> Height    += 1 + 1;
  119. #endif
  120.                     if(Node -> Width > MaxWidth)
  121.                         MaxWidth = Node -> Width;
  122.  
  123.                     if(Node -> Height > MaxHeight)
  124.                         MaxHeight = Node -> Height;
  125.                 }
  126.             }
  127.  
  128.             SCANGROUP(Group,Node)
  129.             {
  130.                 if(Node -> Width < MaxWidth && Node -> Type != YBAR_KIND && Node -> Type != CHECKBOX_KIND)
  131.                 {
  132.                     if(Node -> Type == GROUP_KIND && !Node -> Special . Group . NoIndent)
  133.                         Node -> Special . Group . ExtraLeft += (MaxWidth - Node -> Width) / 2;
  134.  
  135.                     Node -> Width = MaxWidth;
  136.                 }
  137.  
  138.                 if(Node -> Height < MaxHeight && Node -> Type != XBAR_KIND && Node -> Type != CHECKBOX_KIND)
  139.                 {
  140.                     if(Node -> Type == GROUP_KIND && !Node -> Special . Group . NoIndent)
  141.                         Node -> Special . Group . ExtraTop += (MaxHeight - Node -> Height) / 2;
  142.  
  143.                     Node -> Height = MaxHeight;
  144.                 }
  145.             }
  146.         }
  147.         else
  148.         {
  149.             SCANGROUP(Group,Node)
  150.             {
  151.                 LTP_DetermineSize(Handle,Node);
  152.  
  153.                 if(Node -> Type == BUTTON_KIND)
  154.                 {
  155.                     if(Node -> Special . Button . ReturnKey)
  156.                         ReturnKey = Node;
  157.                     else
  158.                     {
  159.                         if(Node -> Special . Button . EscKey)
  160.                             EscKey = Node;
  161.                     }
  162.  
  163.                     DefaultCorrection |= Node -> Special . Button . DefaultCorrection;
  164.                 }
  165.  
  166.                 if(Node -> Type == LISTVIEW_KIND && Node -> Special . List . CursorKey)
  167.                     CursorKey = Node;
  168.  
  169.                 if(Node -> Type == CYCLE_KIND)
  170.                 {
  171.                     if(Node -> Special . Cycle . TabKey)
  172.                         TabKey = Node;
  173.                 }
  174.  
  175. #if defined(DO_POPUP_KIND) && defined(DO_BOOPSI_KIND)
  176.                 if(Node -> Type == POPUP_KIND)
  177.                 {
  178.                     if(Node -> Special . Popup . TabKey)
  179.                         TabKey = Node;
  180.                 }
  181. #endif
  182.  
  183. #if defined(DO_TAB_KIND) && defined(DO_BOOPSI_KIND)
  184.                 if(Node -> Type == TAB_KIND)
  185.                 {
  186.                     if(Node -> Special . Tab . TabKey)
  187.                         TabKey = Node;
  188.                 }
  189. #endif
  190.  
  191.                 if(Node -> Type == MX_KIND)
  192.                 {
  193.                     if(Node -> Special . Radio . TabKey)
  194.                         TabKey = Node;
  195.                 }
  196.             }
  197.  
  198.             if(ReturnKey || DefaultCorrection)
  199.             {
  200.                 SCANGROUP(Group,Node)
  201.                 {
  202. #ifdef OLD_STYLE_DEFAULT_KEY
  203.                     Node -> GroupIndent = TRUE;
  204.  
  205.                     Node -> Width    += 4 + 4;
  206.                     Node -> Height    += 2 + 2;
  207. #else
  208.                     Node -> Width    += 1 + 1;
  209.                     Node -> Height    += 1 + 1;
  210. #endif
  211.                 }
  212.             }
  213.         }
  214.  
  215.         if(Group -> Special . Group . Horizontal)
  216.         {
  217.             LONG x,y,w,MaxTop = 0,MaxWidth = 0,MaxHeight = 0,Count = 0;
  218.  
  219.             if(Group -> Node . mln_Pred -> mln_Pred && Group -> Special . Group . LastAttributes)
  220.             {
  221.                 ObjectNode *LastGroup = (ObjectNode *)Group -> Node . mln_Pred;
  222.  
  223.                 MaxTop        = LastGroup -> Special . Group . MaxOffset;
  224.                 MaxHeight    = LastGroup -> Special . Group . MaxSize;
  225.             }
  226.  
  227.             SCANGROUP(Group,Node)
  228.             {
  229.                 if(!LIKE_STRING_KIND(Node) || Node -> Special . String . LinkID == -1)
  230.                 {
  231.                     if(!Group -> Special . Group . Paging && Count++)
  232.                     {
  233.                         if(Node -> ExtraSpace > 0)
  234.                             x = Left + Node -> ExtraSpace * Handle -> InterWidth;
  235.                         else
  236.                         {
  237.                             if(Node -> ExtraSpace < 0)
  238.                                 x = Left - Node -> ExtraSpace;
  239.                             else
  240.                                 x = Left + Handle -> InterWidth;
  241.                         }
  242.                     }
  243.                     else
  244.                         x = Left;
  245.  
  246.                     y = Top;
  247.                     w = Node -> Width;
  248.  
  249.                     switch(Node -> LabelPlace)
  250.                     {
  251.                         case PLACE_LEFT:
  252.  
  253.                             if(Node -> Type == MX_KIND)
  254.                             {
  255.                                 x += Node -> Special . Radio . LabelWidth + INTERWIDTH;
  256.  
  257.                                 if(Node -> Label)
  258.                                 {
  259.                                     if(Node -> Special . Radio . TitlePlace == PLACETEXT_LEFT)
  260.                                         x += Node -> LabelWidth + INTERWIDTH;
  261.                                     else
  262.                                         w += INTERWIDTH + Node -> LabelWidth;
  263.                                 }
  264.                             }
  265.                             else
  266.                             {
  267.                                 if(Node -> Label || (Node -> Type == BOX_KIND && Node -> Special . Box . Labels))
  268.                                     x += Node -> LabelWidth + INTERWIDTH;
  269.                             }
  270.  
  271.                             break;
  272.  
  273.                         case PLACE_RIGHT:
  274.  
  275.                             if(Node -> Type == MX_KIND)
  276.                             {
  277.                                 w += INTERWIDTH + Node -> Special . Radio . LabelWidth;
  278.  
  279.                                 if(Node -> Label)
  280.                                 {
  281.                                     if(Node -> Special . Radio . TitlePlace == PLACETEXT_LEFT)
  282.                                         x += Node -> LabelWidth + INTERWIDTH;
  283.                                     else
  284.                                         w += INTERWIDTH + Node -> LabelWidth;
  285.                                 }
  286.                             }
  287.                             else
  288.                             {
  289.                                 if(Node -> Label || (Node -> Type == BOX_KIND && Node -> Special . Box . Labels))
  290.                                     w += INTERWIDTH + Node -> LabelWidth;
  291.                             }
  292.  
  293.                             break;
  294.  
  295.                         case PLACE_ABOVE:
  296.  
  297.                             if(Node -> Label || (Node -> Type == BOX_KIND && Node -> Special . Box . Labels))
  298.                             {
  299.                                 if(Node -> Type == LISTVIEW_KIND && Node -> Special . List . TextAttr && Node -> Special . List . FlushLabelLeft)
  300.                                     y += Node -> Special . List . FixedGlyphHeight + INTERHEIGHT;
  301.                                 else
  302.                                     y += Handle -> RPort . TxHeight + INTERHEIGHT;
  303.                             }
  304.  
  305.                             break;
  306.  
  307.                         case PLACE_BELOW:
  308.  
  309.                             break;
  310.  
  311.                         case PLACE_IN:
  312.  
  313.                             break;
  314.                     }
  315.  
  316.                     if(Node -> Type == SLIDER_KIND)
  317.                     {
  318.                         if(Node -> Special . Slider . LevelPlace == PLACETEXT_RIGHT && Node -> Special . Slider . LevelFormat)
  319.                             w += INTERWIDTH + Node -> Special . Slider . LevelWidth;
  320.  
  321.                         if(Node -> Special . Slider . LevelPlace == PLACETEXT_LEFT && Node -> LabelPlace != PLACE_LEFT && Node -> Special . Slider . LevelFormat)
  322.                             x += INTERWIDTH + Node -> Special . Slider . LevelWidth;
  323.                     }
  324.  
  325. #ifdef DO_LEVEL_KIND
  326.                     if(Node -> Type == LEVEL_KIND)
  327.                     {
  328.                         if(Node -> Special . Level . LevelPlace == PLACETEXT_RIGHT)
  329.                             w += INTERWIDTH + Node -> Special . Level . MaxLevelWidth;
  330.  
  331.                         if(Node -> Special . Level . LevelPlace == PLACETEXT_LEFT && Node -> LabelPlace != PLACE_LEFT)
  332.                             x += INTERWIDTH + Node -> Special . Level . MaxLevelWidth;
  333.                     }
  334. #endif    /* DO_LEVEL_KIND */
  335.  
  336.                     if(Node -> Type == LISTVIEW_KIND && Node -> Special . List . ExtraLabelWidth)
  337.                         x += Node -> Special . List . ExtraLabelWidth + INTERWIDTH;
  338.  
  339.                     if(y > MaxTop)
  340.                         MaxTop = y;
  341.  
  342.                     if(Node -> Height > MaxHeight)
  343.                         MaxHeight = Node -> Height;
  344.  
  345.                     if(Node -> LabelPlace == PLACE_BELOW && Node -> Label)
  346.                     {
  347.                         LONG Height;
  348.  
  349.                         if(Node -> Type == LISTVIEW_KIND && Node -> Special . List . TextAttr && Node -> Special . List . FlushLabelLeft)
  350.                             Height = Node -> Height + INTERHEIGHT + Node -> Special . List . FixedGlyphHeight;
  351.                         else
  352.                             Height = Node -> Height + INTERHEIGHT + Handle -> RPort . TxHeight;
  353.  
  354.                         if(Height > MaxHeight)
  355.                             MaxHeight = Height;
  356.                     }
  357.                     else
  358.                     {
  359.                         if(Node -> Height > MaxHeight)
  360.                             MaxHeight = Node -> Height;
  361.                     }
  362.  
  363.                     if(x + w > MaxWidth)
  364.                         MaxWidth = x+w;
  365.  
  366.                     Node -> Left = x;
  367.  
  368.                     if(!Group -> Special . Group . Paging)
  369.                         Left = x + w;
  370.                 }
  371.             }
  372.  
  373.             SCANGROUP(Group,Node)
  374.             {
  375.                 if(!LIKE_STRING_KIND(Node) || Node -> Special . String . LinkID == -1)
  376.                 {
  377.                     Node -> Top = MaxTop;
  378.  
  379.                     if(Node -> Height < MaxHeight)
  380.                     {
  381. #ifdef DO_BOOPSI_KIND
  382.                         if((Node -> Type == PALETTE_KIND && !Node -> Special . Palette . UsePicker) || Node -> Type == LISTVIEW_KIND || (Node -> Type == BOOPSI_KIND && !Node -> Special . BOOPSI . ExactHeight))
  383. #else
  384.                         if((Node -> Type == PALETTE_KIND && !Node -> Special . Palette . UsePicker) || Node -> Type == LISTVIEW_KIND || Node -> Type == BOOPSI_KIND)
  385. #endif    /* DO_BOOPSI_KIND */
  386.                             Node -> Height = MaxHeight;
  387.                         else
  388.                         {
  389.                             if(Node -> Type == GROUP_KIND)
  390.                             {
  391.                                 if(Node -> Special . Group . Spread)
  392.                                     LTP_Spread(Handle,Node,Node -> Width,MaxHeight);
  393.                                 else
  394.                                 {
  395.                                     if(!Node -> Special . Group . NoIndent)
  396.                                         Node -> Special . Group . ExtraTop += (MaxHeight - Node -> Height) / 2; /* !FIX! */
  397.                                 }
  398.  
  399.                                 Node -> Height = MaxHeight;
  400.                             }
  401.                         }
  402.                     }
  403.                 }
  404.             }
  405.  
  406.             Group -> Special . Group . MaxOffset = MaxTop;
  407.             Group -> Special . Group . MaxSize   = MaxHeight;
  408.  
  409.             if(Group -> Special . Group . Paging)
  410.                 Width = MaxWidth;
  411.             else
  412.                 Width = Left;
  413.  
  414.             Height    = MaxTop + MaxHeight;
  415.         }
  416.         else
  417.         {
  418.             LONG x,y,w,MaxLeft = 0,MaxWidth = 0,MaxHeight = 0,Count = 0;
  419.  
  420.             if(Group -> Node . mln_Pred -> mln_Pred && Group -> Special . Group . LastAttributes)
  421.             {
  422.                 ObjectNode *LastGroup = (ObjectNode *)Group -> Node . mln_Pred;
  423.  
  424.                 MaxLeft     = LastGroup -> Special . Group . MaxOffset;
  425.                 MaxWidth    = LastGroup -> Special . Group . MaxSize;
  426.             }
  427.  
  428.             SCANGROUP(Group,Node)
  429.             {
  430.                 if(!LIKE_STRING_KIND(Node) || Node -> Special . String . LinkID == -1)
  431.                 {
  432.                     if(!Group -> Special . Group . Paging && Count++)
  433.                     {
  434.                         if(Node -> ExtraSpace > 0)
  435.                             y = Top + Node -> ExtraSpace * Handle -> InterHeight;
  436.                         else
  437.                         {
  438.                             if(Node -> ExtraSpace < 0)
  439.                                 y = Top - Node -> ExtraSpace;
  440.                             else
  441.                                 y = Top + Handle -> InterHeight;
  442.                         }
  443.                     }
  444.                     else
  445.                         y = Top;
  446.  
  447.                     w = Node -> Width;
  448.                     x = Left;
  449.  
  450.                     switch(Node -> LabelPlace)
  451.                     {
  452.                         case PLACE_LEFT:
  453.  
  454.                             if(Node -> Type == MX_KIND)
  455.                             {
  456.                                 x += Node -> Special . Radio . LabelWidth + INTERWIDTH;
  457.  
  458.                                 if(Node -> Label)
  459.                                 {
  460.                                     if(Node -> Special . Radio . TitlePlace == PLACETEXT_LEFT)
  461.                                         x += Node -> LabelWidth + INTERWIDTH;
  462.                                 }
  463.                             }
  464.                             else
  465.                             {
  466.                                 if(Node -> Label || (Node -> Type == BOX_KIND && Node -> Special . Box . Labels))
  467.                                     x += Node -> LabelWidth + INTERWIDTH;
  468.                             }
  469.  
  470.                             break;
  471.  
  472.                         case PLACE_RIGHT:
  473.  
  474.                             if(Node -> Type == MX_KIND)
  475.                             {
  476.                                 w += INTERWIDTH + Node -> Special . Radio . LabelWidth;
  477.  
  478.                                 if(Node -> Label)
  479.                                 {
  480.                                     if(Node -> Special . Radio . TitlePlace == PLACETEXT_LEFT)
  481.                                         x += Node -> LabelWidth + INTERWIDTH;
  482.                                     else
  483.                                         w += INTERWIDTH + Node -> LabelWidth;
  484.                                 }
  485.                             }
  486.                             else
  487.                             {
  488.                                 if(Node -> Label || (Node -> Type == BOX_KIND && Node -> Special . Box . Labels))
  489.                                     w += INTERWIDTH + Node -> LabelWidth;
  490.                             }
  491.  
  492.                             break;
  493.  
  494.                         case PLACE_ABOVE:
  495.  
  496.                             if(Node -> Label || (Node -> Type == BOX_KIND && Node -> Special . Box . Labels))
  497.                             {
  498.                                 if(Node -> Type == LISTVIEW_KIND && Node -> Special . List . TextAttr && Node -> Special . List . FlushLabelLeft)
  499.                                     y += Node -> Special . List . FixedGlyphHeight + INTERHEIGHT;
  500.                                 else
  501.                                     y += Handle -> RPort . TxHeight + INTERHEIGHT;
  502.                             }
  503.  
  504.                             break;
  505.  
  506.                         case PLACE_BELOW:
  507.  
  508.                             break;
  509.  
  510.                         case PLACE_IN:
  511.  
  512.                             break;
  513.                     }
  514.  
  515.                     if(Node -> Type == SLIDER_KIND)
  516.                     {
  517.                         if(Node -> Special . Slider . LevelPlace == PLACETEXT_RIGHT && Node -> Special . Slider . LevelFormat)
  518.                             w += INTERWIDTH + Node -> Special . Slider . LevelWidth;
  519.  
  520.                         if(Node -> Special . Slider . LevelPlace == PLACETEXT_LEFT && Node -> LabelPlace != PLACE_LEFT && Node -> Special . Slider . LevelFormat)
  521.                             x += INTERWIDTH + Node -> Special . Slider . LevelWidth;
  522.                     }
  523.  
  524. #ifdef DO_LEVEL_KIND
  525.                     if(Node -> Type == LEVEL_KIND)
  526.                     {
  527.                         if(Node -> Special . Level . LevelPlace == PLACETEXT_RIGHT)
  528.                             w += INTERWIDTH + Node -> Special . Level . MaxLevelWidth;
  529.  
  530.                         if(Node -> Special . Level . LevelPlace == PLACETEXT_LEFT && Node -> LabelPlace != PLACE_LEFT)
  531.                             x += INTERWIDTH + Node -> Special . Level . MaxLevelWidth;
  532.                     }
  533. #endif    /* DO_LEVEL_KIND */
  534.                     if(Node -> Type == LISTVIEW_KIND && Node -> Special . List . ExtraLabelWidth)
  535.                         x += Node -> Special . List . ExtraLabelWidth + INTERWIDTH;
  536.  
  537.                     if(x > MaxLeft)
  538.                         MaxLeft = x;
  539.  
  540.                     if(w > MaxWidth)
  541.                         MaxWidth = w;
  542.  
  543.                     if(y + Node -> Height > MaxHeight)
  544.                         MaxHeight = y + Node -> Height;
  545.  
  546.                     Node -> Top = y;
  547.  
  548.                     if(!Group -> Special . Group . Paging)
  549.                         Top = y + Node -> Height;
  550.  
  551.                     if(Node -> LabelPlace == PLACE_BELOW && Node -> Label)
  552.                     {
  553.                         if(Node -> Type == LISTVIEW_KIND && Node -> Special . List . TextAttr && Node -> Special . List . FlushLabelLeft)
  554.                             Top += INTERHEIGHT + Node -> Special . List . FixedGlyphHeight;
  555.                         else
  556.                             Top += INTERHEIGHT + Handle -> RPort . TxHeight;
  557.                     }
  558.                 }
  559.             }
  560.  
  561.             SCANGROUP(Group,Node)
  562.             {
  563.                 if(!LIKE_STRING_KIND(Node) || Node -> Special . String . LinkID == -1)
  564.                 {
  565.                     Node -> Left = MaxLeft;
  566.  
  567.                     if(Node -> Type == GROUP_KIND && Group -> Special . Group . Paging && !Node -> Special . Group . NoIndent)
  568.                         Node -> Special . Group . ExtraTop += (MaxHeight - Node -> Height) / 2;
  569.  
  570.                     if(Node -> Width < MaxWidth)
  571.                     {
  572.                         if(Node -> Type == GROUP_KIND)
  573.                         {
  574.                             if(Node -> Special . Group . Spread)
  575.                                 LTP_Spread(Handle,Node,MaxWidth,Node -> Height);
  576.                             else
  577.                             {
  578.                                 if(!Node -> Special . Group . NoIndent)
  579.                                     Node -> Special . Group . ExtraLeft += (MaxWidth - Node -> Width) / 2;
  580.                             }
  581.  
  582.                             Node -> Width = MaxWidth;
  583.                         }
  584.                         else
  585.                         {
  586. #ifdef DO_BOOPSI_KIND
  587.                             if((Node -> Type == PALETTE_KIND && !Node -> Special . Palette . UsePicker) || (Node -> Type == BOOPSI_KIND && !Node -> Special . BOOPSI . ExactWidth) || Node -> Type == LISTVIEW_KIND || Node -> Type == TEXT_KIND || Node -> Type == GAUGE_KIND || Node -> Type == NUMBER_KIND || Node -> Type == CYCLE_KIND || LIKE_STRING_KIND(Node) || Node -> Type == INTEGER_KIND || Node -> Type == BUTTON_KIND || Node -> Type == SLIDER_KIND || Node -> Type == BOX_KIND || Node -> Type == SCROLLER_KIND || Node -> Type == LEVEL_KIND || Node -> Type == POPUP_KIND || Node -> Type == TAB_KIND)
  588. #else
  589.                             if((Node -> Type == PALETTE_KIND && !Node -> Special . Palette . UsePicker) || Node -> Type == LISTVIEW_KIND || Node -> Type == TEXT_KIND || Node -> Type == GAUGE_KIND || Node -> Type == NUMBER_KIND || Node -> Type == CYCLE_KIND || LIKE_STRING_KIND(Node) || Node -> Type == INTEGER_KIND || Node -> Type == BUTTON_KIND || Node -> Type == SLIDER_KIND || Node -> Type == BOX_KIND || Node -> Type == SCROLLER_KIND || Node -> Type == LEVEL_KIND)
  590. #endif    /* DO_BOOPSI_KIND */
  591.                             {
  592.                                 if((Node -> Type != LISTVIEW_KIND || !Node -> Special . List . LockSize) && (Node -> Type != TEXT_KIND || !Node -> Special . Text . LockSize))
  593.                                 {
  594.                                     if(Node -> Label && Node -> LabelPlace == PLACE_RIGHT)
  595.                                         Node -> Width = MaxWidth - (INTERWIDTH + Node -> LabelWidth);
  596.                                     else
  597.                                         Node -> Width = MaxWidth;
  598.                                 }
  599.                             }
  600.                             else
  601.                             {
  602.                                 if(Node -> Type == SLIDER_KIND)
  603.                                 {
  604.                                     if(Node -> Special . Slider . LevelPlace == PLACE_RIGHT)
  605.                                     {
  606.                                         if(Node -> Width + Node -> Special . Slider . LevelWidth + INTERWIDTH < MaxWidth && Node -> Special . Slider . LevelFormat)
  607.                                             Node -> Width = MaxWidth - (Node -> Special . Slider . LevelWidth + INTERWIDTH);
  608.                                     }
  609.                                     else
  610.                                         Node -> Width = MaxWidth;
  611.                                 }
  612.  
  613. #ifdef DO_LEVEL_KIND
  614.                                 if(Node -> Type == LEVEL_KIND)
  615.                                 {
  616.                                     if(Node -> Special . Level . LevelPlace == PLACE_RIGHT)
  617.                                     {
  618.                                         if(Node -> Width + Node -> Special . Level . MaxLevelWidth + INTERWIDTH < MaxWidth)
  619.                                             Node -> Width = MaxWidth - (Node -> Special . Level . MaxLevelWidth + INTERWIDTH);
  620.                                     }
  621.                                     else
  622.                                         Node -> Width = MaxWidth;
  623.                                 }
  624. #endif    /* DO_LEVEL_KIND */
  625.                             }
  626.                         }
  627.                     }
  628.                 }
  629.             }
  630.  
  631.             Group -> Special . Group . MaxOffset  = MaxLeft;
  632.             Group -> Special . Group . MaxSize    = MaxWidth;
  633.  
  634.             if(Group -> Special . Group . Paging)
  635.                 Height = MaxHeight;
  636.             else
  637.                 Height = Top;
  638.  
  639.             Width = MaxLeft + MaxWidth;
  640.         }
  641.  
  642.         Group -> Left    = 0;
  643.         Group -> Top    = 0;
  644.         Group -> Width    = Width;
  645.         Group -> Height = Height;
  646.  
  647.         if(Group -> Label || Group -> Special . Group . Frame)
  648.         {
  649.             if(Group -> Label)
  650.             {
  651.                 Group -> LabelWidth = LT_LabelWidth(Handle,Group -> Label) + 2 * Handle -> GlyphWidth;
  652.  
  653.                 Group -> Height += Handle -> RPort . TxHeight + 2 * Handle -> InterHeight + 3;
  654.             }
  655.             else
  656.             {
  657.                 Group -> LabelWidth = 0;
  658.  
  659.                 Group -> Height += 2 + 2 * Handle -> InterHeight + 3;
  660.             }
  661.  
  662.             if(Group -> LabelWidth > Group -> Width)
  663.             {
  664.                 if(!Node -> Special . Group . NoIndent)
  665.                     Group -> Special . Group . ExtraLeft += (Group -> LabelWidth - Group -> Width) / 2;
  666.  
  667.                 Group -> Width = Group -> LabelWidth;
  668.             }
  669.  
  670.             Group -> Width += 2 * (Handle -> GlyphWidth + Handle -> InterWidth) + 8;
  671.         }
  672.  
  673.         if(Group -> Special . Group . IndentX)
  674.         {
  675.             Group -> Width                += 2 * Handle -> InterWidth;
  676.             Group -> Special . Group . ExtraLeft    += Handle -> InterWidth;
  677.         }
  678.  
  679.         if(Group -> Special . Group . IndentY)
  680.         {
  681.             Group -> Height                += 2 * Handle -> InterHeight;
  682.             Group -> Special . Group . ExtraTop    += Handle -> InterHeight;
  683.         }
  684.  
  685.         if(ReturnKey)
  686.             Handle -> ReturnKey = ReturnKey;
  687.  
  688.         if(EscKey)
  689.             Handle -> EscKey = EscKey;
  690.  
  691.         if(CursorKey)
  692.             Handle -> CursorKey = CursorKey;
  693.  
  694.         if(TabKey)
  695.             Handle -> TabKey = TabKey;
  696.  
  697.         if(ActiveString)
  698.             Handle -> ActiveString = ActiveString;
  699.     }
  700. }
  701.